//============================================================================
// Nombre		: IUC.cpp
// Materia		: Organizacion de Datos (75.06) - FIUBA
// Catedra		: AZCURRA-GUTIERREZ-SANTOS
// Autor		: Tkaczyszyn, Muszalski, Gallinal, Fernandez
// Descripcion	: TPDatos , Ansi-style
//============================================================================

#include <iostream>
#include "../cute/cute.h"
#include "../cute/ide_listener.h"
#include "../cute/cute_runner.h"
#include "ModuloAlmacenamiento/GeneradorIUC.h"
#include "ModuloAlmacenamiento/Correo.h"
#include "ModuloAlmacenamiento/ArchivadorCorreo.h"
#include "ModuloAlmacenamiento/DireccionDeCorreo.h"
#include "ModuloAlmacenamiento/ManejadorArchivo.h"


using namespace std;


typedef struct{
	int x;
	int y;
}Prueba;


void testCantidadDeBytesAsuntoMetadata()
{
	GeneradorIUC* genIuc = GeneradorIUC::getInstancia();

	Correo* correo = new Correo();

	DireccionDeCorreo* origen = new DireccionDeCorreo((char *)"nico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.comnico24@abie.com");

	correo->iuc = genIuc->generarNuevoIUC();
	correo->fecha=(char *)"121120102034";
	correo->origen = origen;
	correo->asunto = (char *)"Prueba obtener metadata";
	correo->mensaje = (char *)"lalalala";

	cout<< correo->asunto;
	cout<< correo->origen->direccion;

	ArchivadorCorreo* archivadorCorreo = new ArchivadorCorreo();
	archivadorCorreo->GuardarCorreo(correo);



}

void testGeneradorIUC()
{
	GeneradorIUC* genIuc = GeneradorIUC::getInstancia();
	IUC* iucAux;
	int maximo = 1000;

	//se generan iucs a modo de testeo:
	for(int i=0;i<maximo;i++)
			iucAux = genIuc->generarNuevoIUC();

	ASSERTM("Se generaron UICs", genIuc->getUltimoIUC()->getId()==iucAux->getId());
	//ASSERTM("Se generaron UICs", genIuc->getUltimoIUC()->getId()=="0000");//pueba de falla
}

//TODO ver que pasa cuando se Recupera una estructura y despues se itenta volver a escribir.
void testManejadorArchivo()
{
	Prueba* p;
	fstream arc;

	p->x = 20;
	p->y = 35;
/*
	ASSERTM("Archivo creado",ManejadorArchivo::Crear("prueba.dat", &arc));
	ASSERTM("Escribe arc binario al final",	ManejadorArchivo::EscribirEstructura(&arc, p, sizeof(Prueba)));
	ASSERTM("Escribe arc binario al final",	ManejadorArchivo::EscribirEstructura(&arc, p, sizeof(Prueba)));
	ASSERTM("Escribe arc binario al final",	ManejadorArchivo::EscribirEstructura(&arc, p, sizeof(Prueba)));
	ASSERTM("Escribe arc binario con offset",ManejadorArchivo::EscribirEstructura(&arc, p, 20, sizeof(Prueba)));
	ASSERTM("Escribe arc binario al final",	ManejadorArchivo::EscribirEstructura(&arc, p, sizeof(Prueba)));
	ASSERTM("Escribe arc bytes", ManejadorArchivo::EscribirBytes(&arc, (char*) "hola mundo!"));
	ASSERTM("Escribe arc bytes con offset",ManejadorArchivo::EscribirBytes(&arc, (char*)"planeta", 50 , 7));
	ASSERTM("Lee un registro",	(((Prueba*)ManejadorArchivo::RecuperarEstructura(&arc,2, sizeof(Prueba)))!= NULL));
	ASSERTM("Cierra archivo",	ManejadorArchivo::Cerrar("prueba.dat", &arc)== true);
	*/

}

void runGeneradorIUC()
{
	cute::suite s;

	s.push_back(CUTE(testGeneradorIUC));
	cute::ide_listener lis;
	cute::makeRunner(lis)(s, "Prueba Unitaria - GeneradorIUC");

}

void runArchivadorCorreoTests()
{
	cute::suite s;

	s.push_back(CUTE(testCantidadDeBytesAsuntoMetadata));
	cute::ide_listener lis;
	cute::makeRunner(lis)(s, "Prueba Unitaria - ArchivadorCorreo");
}

void runManejadorArchivo()
{
	cute::suite s;

	s.push_back(CUTE(testManejadorArchivo));
	cute::ide_listener lis;
	cute::makeRunner(lis)(s, "Prueba Unitaria - ManejadorArchivo");

}


int main()
{
	//TODO ver el impacto en Esscribir y leer Byte hacer pruebas unitarias.
/*	Prueba p;
	fstream arc;
	stringstream ios(ios_base::in| ios_base::out| ios_base::binary);
*/

	//Escribe data
	/*if (ManejadorArchivo::Crear("bosque.dat", &arc))
	{
		p.x = 11;
		p.y = 20;
		ios.write(reinterpret_cast<char *>(&p),sizeof(Prueba));
		ManejadorArchivo::EscribirEstructura(&arc, &ios, 0, sizeof(Prueba));
		ManejadorArchivo::Cerrar( &arc);
		p.x = 0;
		p.y = 0;
	}


*/

	/*
	//Lee data
	if (ManejadorArchivo::Abrir("bosque.dat", &arc))
	{
		ManejadorArchivo::RecuperarEstructura(&arc,&ios,0, sizeof(Prueba));
		ios.read( reinterpret_cast<char *>(&p), sizeof(Prueba));

		ManejadorArchivo::Cerrar(&arc);
	}
	*/

/*
	cout<< "X: "<< p.x<<", Y: "<<p.y<<endl;
*/

	fstream archivo;
	stringstream ios(ios_base::in| ios_base::out| ios_base::binary);


	int x = 10;

	char* caracter;

	caracter = new char[x];

	for (int xkcd = 0; xkcd < x; xkcd++){

		caracter[xkcd] = 'D';

	}
	caracter[x] = '\0';



	ManejadorArchivo::Crear("Lala.dat", &archivo);

	ios.write(caracter,x);
	ManejadorArchivo::EscribirEstructura(&archivo, &ios, 0, x);


	for (int xkcd = 0; xkcd < x; xkcd++){

		caracter[xkcd] = 'F';

	}
	caracter[x] = '\0';

	cout << "Antes de levantar del archivo: " << caracter << endl << endl;


	ManejadorArchivo::RecuperarEstructura(&archivo,&ios,0, x);
	ios.read(caracter, x);

	ManejadorArchivo::Cerrar(& archivo);


	cout << "Despues de levantar del archivo: " << caracter << endl << endl;



    return 0;
}


